Шаг 8 - Пишем программу.

Настало время написать первую реальную программку на Fox'е. Из-за задачи, которую мы рассмотрим, в выходные мне пришлось прервать загородный отдых и в воскресенье выйти на работу, ну да ладно.

Суть задачи такова: у нас есть три таблицы с одинаковыми полями (номер банковского счета и сумма оборотов за период по счету), но за разное время. Первая таблица (tab1) за первый квартал, вторая (tab2) - за второй, а третья (tab3) - за полугодие. Так вот, теоретически, сложив суммы по счетам за оба квартала, мы должны получить тоже самое что и за полугодие. Но на практике расчет делался разными алгоритмами и итоги не сошлись, к моему великому сожалению :-( Давайте найдем по каким счетам расчеты не совпали.

Итак, начнем. Запускаем FoxPro, в меню File выбираем New, в появившемся диалоговом окне устанавливаем Program и жмем NewFile.

8_1.gif (8305 b)

Перед нами появляется пустое окно с заголовком Program1, в котором пишем следующий текст:

* Устанавливаем рабочую директорию, по умолчанию установлен
* каталог, от куда был запущен FoxPro
set defa to c:\bank 
* Отключаем безопасность, чтобы не было
* запросов на подтверждение перезаписи и т.п.
set safety off 
* Закрываем все открытые нами рабочие области, чтобы
* при очередном запуске программы открыть их вновь
close data all
* Делаем копию таблицы за полугодие, чтобы ничего не испортить :-)
select * from tab3 into table tab4

	* У нас уже есть поле sald_ - сумма за период
	* (название не подходящее, сальдо - это остаток, но не я его давал)
	* Добавим три новых поля в копию полугодовой таблицы:
	* sald_1 - сумма за первый квартал,
	* sald_2 - сумма за второй квартал,
	* saldo - сумма sald_1 + sald_2
	alter table tab4;
add column sald_1 n(20, 2);
		add column sald_2 n(20, 2);
add column saldo n(20, 2)
	* Открываем таблицу
	use tab4
		* Перебираем поочередно все записи в таблице,
		* для которых код валюты = 810 (этого требует ситуация)
		scan for kod_v_="810"
			* Записываем текущий счет в переменную
			cCount=tab4.s_
			* Находим сумму по текущему счету за 1-й кв.
			select sald_ from tab1 into cursor tmp1 where s_=cCount
			if _tally>0
				&& Если счет найден в таблице, записываем сумму
				nSaldo1=tmp1.sald_
			else
&& Иначе записываем в переменную 0
				nSaldo1=0
			endif
			* Тоже самое делаем по 2-му кв.
			select sald_ from tab2 into cursor tmp2 where s_=cCount
			if _tally>0
				nSaldo2=tmp2.sald_
			else
				nSaldo2=0
			endif
			* Делаем текущей нашу изменяемую таблицу
			select tab4
			* Меняем пустые поля для текущего счета
			replace sald_1 with nSaldo1,;
				sald_2 with nSaldo2,;
				saldo   with nSaldo1+nSaldo2
		endscan
		* Смотрим на результат
		select s_, sald_, saldo, sald_1, sald_2 from tab4	where sald_<>saldo
		* Закрываем таблицу
	use

По завершению набора кода, можно его скомпилировать (меню Program\Compile). Если до этого вы не сохранили программу, то при компиляции появится диалоговое окно с предложением сделать это. Вот собственно и все можно запускать программу ("!" на панели инструментов).


Автор Клементьев В.А.
Hosted by uCoz